/*
 * Copyright 2011-2024 the original author or authors.
 *
 * Licensed under the Apache License, Version 2.0.
 * See `LICENSE` in the project root for license information.
 */

package me.ijleex.platform.framework.page.util;

/**
 * 分页计算工具
 *
 * @author liym
 * @since 2017-04-11 10:44 新建
 */
public abstract class PageCalcUtils {

    private PageCalcUtils() {
    }

    /**
     * 根据分页偏移量与每页显示数据条数，计算当前页码
     *
     * <pre> {@code
     * int pageNo = (offset / limit) + 1;
     * }
     * </pre>
     *
     * @param offset 偏移量，如 0、10
     * @param limit 每页显示数据条数，如 10
     * @return 当前页码，如 1、2
     * @see #calcOffset(int, int)
     * @since 2017-04-11 10:06:58
     */
    public static int calcPageNo(int offset, int limit) {
        if (limit <= 0) {
            return 1;
        }
        return (offset / limit) + 1;
    }

    /**
     * 根据当前页码与每页显示数据条数，计算分页偏移量（用于SQL查询）
     *
     * <pre> {@code
     * int offset = (pageNo - 1) * pageSize;
     * }
     * </pre>
     *
     * @param pageNo 当前页码，如 1、2
     * @param pageSize 每页显示数据条数，如 10
     * @return 偏移量，如 0、10
     * @see #calcPageNo(int, int)
     * @since 2017-04-11 10:09:26
     */
    public static int calcOffset(int pageNo, int pageSize) {
        pageNo = (pageNo <= 0) ? 1 : pageNo;
        return (pageNo - 1) * pageSize;
    }

    /**
     * 根据 数据总条数、每页显示数据条数，计算<b>总页数</b>
     *
     * <pre> {@code
     * int pageCount = (total + pageSize -1) / pageSize;
     *
     * 其中，pageSize - 1 就是 total / pageSize 的最大的余数
     * }
     * </pre>
     *
     * @param total 数据总条数，如 88
     * @param pageSize 每页显示数据条数，如 10
     * @return 分页总页数，如 9
     * @since 2019-03-06 10:44
     */
    public static int calcPageCount(long total, int pageSize) {
        return (int) (total + pageSize - 1L) / pageSize;
    }

}
